home *** CD-ROM | disk | FTP | other *** search
-
- #include <stdio.h>
- #include "c_calls.h"
-
- void print_calls(LIST list, const char *name, int depth, LIST *fcns)
-
- /*
- Print out the name of the current fcn, and recursively print the names
- of all fcns called by the current fcn (i.e. "expand" the current fcn).
- */
-
- {
- LIST tmp;
- int i;
-
- for (i = 1; i <= depth; i++)
- printf("%1d ", (i - 1) % 10); /* Print name of current fcn. */
-
- if (find_cell(*fcns, name) != NULL) /* Don't continue recursive call. */
- printf("%s...\n", name);
- else
- {
- printf("%s\n", name);
-
- /* Save the name of the current fcn to avoid infinite expansion. */
- insert_cell(fcns, name);
-
- /* Print out names of all fcns called by the current fcn. */
- tmp = find_cell(list, name);
-
- for (tmp = tmp->calls; tmp != NULL; tmp = tmp->next)
- print_calls(list, tmp->name, depth + 1, fcns);
-
- /* Delete name of current fcn after completely expanding it. */
- delete_cell(fcns, name);
- }
- }
-
-
- void print_all_calls(LIST list)
-
- /* Print the fcn call tree. */
-
- {
- LIST tmp1, tmp2, fcns = NULL;
-
- for (tmp1 = list; tmp1 != NULL; tmp1 = tmp1->next)
- {
- print_calls(list, tmp1->name, 0, &fcns);
- printf("\n%s is called by:\n", tmp1->name);
-
- for (tmp2 = tmp1->called_from; tmp2 != NULL; tmp2 = tmp2->next)
- printf(" %s\n", tmp2->name);
- printf("\n\n");
- }
- }
-